package com.faya.green.config.freemarker;

import com.jagregory.shiro.freemarker.ShiroTags;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;

import javax.annotation.PostConstruct;

/**
 * @author ：LX
 * 创建时间： 2018/11/1. 9:26
 * 地点：广州
 * 目的: shiro标签在freemarker中使用的初始化类
 * 备注说明：
 */
@Component
public class ShiroTagsFreeMarkerCfg {

    @Autowired
    private FreeMarkerConfigurer freeMarkerConfigurer;

    /**
     * @PostConstruct 用来修饰一个非静态的void()方法
     * 被@PostConstruct修饰的方法会在服务器加载Servle的时候运行，并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。
     */
    @PostConstruct
    public void setSharedVariable(){
        freeMarkerConfigurer.getConfiguration().setSharedVariable("shiro", new ShiroTags());
    }


    /**
     * =======shiro标签和freemarker整合====================================================
     *
     1、session中读取登录人信息
     <@shiro.principal/>

     2、带有loginName属性的对象转换为Prinipal后保存在session
     <shiro:principal property="loginName" />

     3、带有loginName属性的Json(个人使用的是FashJson对象)转换为Prinipal后保存在session，使用freemarker标签处理Json
     <#assign loginInfo><@shiro.principal/></#assign>
     <#assign data=loginInfo?eval>
     用户：${data.loginName!""}
     4、其他shiro标签使用
     <@shiro.hasPermission name="权限编码">
     ...
     </@shiro.hasPermission>


     常用标签================================================
     guest（游客）
     <@shiro.guest>
     您当前是游客，<a href="javascript:void(0);" class="dropdown-toggle qqlogin" >登录</a>
     </@shiro.guest>

     user（已经登录，或者记住我登录）
     <@shiro.user>
     欢迎[<@shiro.principal/>]登录，<a href="/logout.shtml">退出</a>
     </@shiro.user>

     authenticated（已经认证，排除记住我登录的）
     <@shiro.authenticated>
     用户[<@shiro.principal/>]已身份验证通过
     </@shiro.authenticated>

     .notAuthenticated（和authenticated相反）
     <@shiro.notAuthenticated>
     当前身份未认证（包括记住我登录的）
     </@shiro.notAuthenticated>

     return new SimpleAuthenticationInfo(user,user.getPswd(), getName());
     在new SimpleAuthenticationInfo(第一个参数,....)的第一个参数放的如果是一个username，那么就可以直接用 <@shiro. principal/> 取到username
     如果第一个参数放的是对象，比如我喜欢放User对象。那么如果要取username字段。 <@shiro.principal property="username"/> 需要指定property-

     判断是否拥有这个角色
     <@shiro.hasRole name="admin">
     用户[<@shiro.principal/>]拥有角色admin<br/>
     </@shiro.hasRole>

     判断是否拥有这些角色的其中一个
     <@shiro.hasAnyRoles name="admin,user,member">
     用户[<@shiro.principal/>]拥有角色admin或user或member<br/>
     </@shiro.hasAnyRoles>

     .lacksRole标签（判断是否不拥有这个角色）
     <@shiro.lacksRole name="admin">
     用户[<@shiro.principal/>]不拥有admin角色
     </@shiro.lacksRole>

     hasPermission标签（判断是否有拥有这个权限）
     <@shiro.hasPermission name="user:add">
     用户[<@shiro.principal/>]拥有user:add权限
     </@shiro.hasPermission>

     lacksPermission标签（判断是否没有这个权限）
     <@shiro.lacksPermission name="user:add">
     用户[<@shiro.principal/>]不拥有user:add权限
     </@shiro.lacksPermission>

     */

}
